יש לי מערך ב-PHP, שהמפתחות שלו הם מספרים (בעצם תאריך) - יכול להיות שיהיו 2 מפתחות זהים או יותר, והערכים שלו לא כל כך משמעותיים לשאלה, אך לא יכולים להיות 2 זהים.
עכשיו, אני רוצה להציג את ערכי המערך לפי סדר יורד של המפתחות (למעלה - מפתח הכי גבוה; למטה - מפתח הכי נמוך), אבל אני רוצה שאם יהיו כמה מפתחות זהים - הם יסתדרו לפי ה-a, b, c של הערכים (בתוך סידור המפתחות).
לאחר מכן, הפכתי את זה, כך שהמפתחות הקודמים (המספרים) הם הערכים החדשים, והערכים הישנים הם המפתחות החדשים.

לדוגמא, נניח שיש לי מערך כזה (מפתח - ערך):
93 - abc
82 - gnj
109 - fjn
93 - pdo
57 - dksm

אני רוצה שהוא יסתדר כך (ולאחר מכן אהפוך את המפתחות לערכים ואת הערכים למפתחות):
109 - fjn
93 - abc
93 - pdo
82 - gnj
57 - dksm

ולא ששני ה-93 יסתדרו באקראיות ביניהם.


השתמשתי, כמובן, ב-arsort().
אשמח לעזרה.
תודה מראש.

15 תשובות

avatar ענה intval ב 09 לינואר 2012 #

כלומר במילים פשוטו אתה רוצה לסדר מערך לפי המפתחות שלו בסדר יורד, אבל אם לשני ערכים יש את אותו מפתח - לסדר לפי הערך שלהם?
עכשיו אני צריך רק להבין איך זה שיש לך שני אלמנטים במערך עם אותו מפתח כי זה בלתי אפשרי.

avatar ענה משתמש_73747 ב 09 לינואר 2012 #

כן. :)

date_default_timezone_set('Asia/Jerusalem');
$files_array=glob("{*.php,*.html}",GLOB_BRACE|GLOB_NOSORT);
foreach ($files_array as $file_path) {
if ($file_path!="pie.php"&&$file_path!="index.php") {
$files[$file_path]=filectime($file_path);}}
arsort($files);
arsort($files);
$filesnames=array_keys($files);
foreach ($filesnames as $file) {
echo '<a href="'.$file.'">'.$file.'</a> - עודכן לאחרונה ב-'.date("d.n.Y H:i:s.", filectime($file)).'<br />';}?>


יש שם פעמיים arsort($files); בגלל שזה עזר לי פעם, אבל עכשיו לא...

avatar ענה intval ב 09 לינואר 2012 #

הבנתי מה אתה רוצה לעשות. אין לך פה שני אלמנטים אם אותו מפתח. כל אופן, יש את הפונקציה array_multisort
בה אתה יכול למיין מערך לפי סדר של מערכים אחרים. "המערכים האחרים" זה רשימה לפי הסדר קודם של זמנים, ואחר כך של שמות. יוצא משהו כזה:

$new = array_multisort(array_values($files), SORT_DESC, array_keys($files), SORT_ASC, $files);

avatar ענה משתמש_73747 ב 09 לינואר 2012 #

תודה. :)
לא הצלחתי להבין... יש סיכוי שתוכל לכתוב את הקוד המלא כמו שכתבתי למעלה לפי מה שאמרת?

avatar ענה intval ב 09 לינואר 2012 #

date_default_timezone_set('Asia/Jerusalem');
$files_array=glob("{*.php,*.html}",GLOB_BRACE|GLOB_NOSORT);
foreach ($files_array as $file_path) {
if ($file_path!="pie.php"&&$file_path!="index.php") {
$files[$file_path]=filectime($file_path);}}

$new = array_multisort(array_values($files), SORT_DESC, array_keys($files), SORT_ASC, $files);

foreach ($filesnames as $file) {
echo '<a href="'.$file.'">'.$file.'</a> - עודכן לאחרונה ב-'.date("d.n.Y H:i:s.", filectime($file)).'<br />';}?>

avatar ענה intval ב 09 לינואר 2012 #

את ה foreach האחרון צריך לעשות על המערך new לא על filenames
ואני צריך לעשות עריכת תשובות כאן :)

avatar ענה משתמש_73747 ב 09 לינואר 2012 #

XDDD

Warning: Invalid argument supplied for foreach() in /home/u710538374/public_html/index.php on line 26

avatar ענה intval ב 10 לינואר 2012 #

טעות שלי, array_multisort לא מחזירה ערך, אלה משנה את הערכים שמעבירים אליה.
זה אמור להיות ככה:

date_default_timezone_set('Asia/Jerusalem');
$files_array=glob("{*.php,*.html}",GLOB_BRACE|GLOB_NOSORT);
foreach ($files_array as $file_path) {
if ($file_path!="pie.php"&&$file_path!="index.php") {
$files[$file_path]=filectime($file_path);}}

array_multisort(array_values($files), SORT_DESC, array_keys($files), SORT_ASC, $files);

foreach ($files as $file) {
echo '<a href="'.$file.'">'.$file.'</a> - עודכן לאחרונה ב-'.date("d.n.Y H:i:s.", filectime($file)).'<br />';}

avatar ענה משתמש_77356 ב 10 לינואר 2012 #

קודם כל, תודה ענקית לך! (כרגיל)
עכשיו, מה שכתבת לא עשה מה שהוא צריך לעשות...
הקוד הבא כן עושה את זה:

date_default_timezone_set('Asia/Jerusalem');
$files_array=glob("{*.php,*.html}",GLOB_BRACE|GLOB_NOSORT);
foreach ($files_array as $file_path) {
if ($file_path!="pie.php"&&$file_path!="index.php") {
$files[$file_path]=filectime($file_path);}}
array_multisort(array_values($files), SORT_DESC, array_keys($files), SORT_ASC, $files);
foreach ($files as $file) {
echo '<a href="'.key($files).'">'.key($files).'</a> - עודכן לאחרונה ב-'.date("d.n.Y H:i:s.", $file).'<br />'; next($files);}?>

avatar ענה משתמש_77356 ב 10 לינואר 2012 #

יש בעיה קטנה.
את הקובץ האחרון הוא מציג לי כך:
"- עודכן לאחרונה ב-05.1.2012 22:39:06". כלומר, הוא מציג את תאריך העדכון האחרון שלו כמו שצריך, אבל לא את הקובץ עצמו...

avatar ענה משתמש_77356 ב 10 לינואר 2012 #

טעות שלי, זה לא עובד כמו שצריך.

avatar ענה משתמש_77356 ב 10 לינואר 2012 #

ועכשיו כן! :)
לא השתמשתי נכון ב-key() ו-next(). כנראה זה לא השימוש שלהם.
פשוט הוספתי שורה קצרה לפני ה-foreach:

$files=array_keys($files);

אבל בכל זאת אשמח לדעת איך לגשת למפתח של האיבר הנוכחי במערך בתוך לולאת foreach. :)

avatar ענה משתמש_77356 ב 10 לינואר 2012 #

וגם במקום השורה

if ($file_path!="pie.php"&&$file_path!="index.php") {

ליצור מערך שיכיל את כל הקבצים שאין ברצוני להציג, ושהם לא יוצגו.
(הידע שלי ב-PHP לא משהו לבינתיים).

avatar ענה intval ב 11 לינואר 2012 #

זה foreach

foeach($array as $elKey => $elValue)
{
echo 'key is ', $elKey, ' value is ', $elValue;
}


ובמקרה השני in_array
$skip = array('pie.php', 'index.php');
if(in_array($current_file, $skip)) continue;

avatar ענה משתמש_79245 ב 12 לינואר 2012 #

תודה רבה. :)